package Models

import (
	"baize/database"
	"gorm.io/gorm"
	"time"
)

type UserBase struct {
	Name     string `json:"name"  validate:"required"`
	Username string `json:"username"  validate:"required" gorm:"index:idx_name,unique,length:32"`
	Mobile   string `json:"mobile"`
	Email    string `json:"email" validate:"required"`
}

type Users struct {
	gorm.Model // 这里的配置可以让 ORM 自动维护 ID、创建、更新、删除的时间戳字段
	UserBase
	Password string `json:"password"  validate:"required"`
}

type CreateUsersResponse struct {
	ID        uint `gorm:"primarykey"`
	CreatedAt time.Time
	UpdatedAt time.Time
	UserBase
}

// 自动创建表
func AutoTable() {
	db := database.GetDB()
	db.AutoMigrate(&Users{})
}

// Insert 新增用户
func (users *Users) Insert() (userID uint, err error) {
	AutoTable()
	db := database.GetDB()

	result := db.Create(&users) //  这里的DB变量是 database 包里定义的，Create 函数是 gorm包的创建数据API
	userID = users.ID
	if result.Error != nil {
		err = result.Error
	}
	return // 返回新建数据的id 和 错误信息，在控制器里接收
}

// Destroy 删除用户
func (users *Users) Destroy(id int64) (err error) {
	db := database.GetDB()
	result := db.Model(&users).Where("id = ?", id).Delete(&users)
	if result.Error != nil {
		err = result.Error
	}
	return
}

// Update 修改用户
func (users *Users) Update(id int64) (user Users, err error) {
	db := database.GetDB()
	result := db.Model(&users).Where("id = ?", id).Updates(&users).Scan(&user)
	if result.Error != nil {
		err = result.Error
	}
	return
}

// FindOne 查询所有用户
func (users *Users) FindAll() (user_list []Users, err error) {
	db := database.GetDB()
	result := db.Find(&users) // 这里的 &users 跟返回参数要一致

	if result.Error != nil {
		err = result.Error
		return
	}
	return
}

// 查询指定用户
func (users *Users) FindUser(username string) (user Users, err error) {
	db := database.GetDB()
	result := db.Model(&users).Where("username = ?", username).First(&user)
	if result.Error != nil {
		err = result.Error
	}
	return
}
